package com.ysd.lis.service.sta.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ysd.common.Result;
import com.ysd.lis.dto.sta.StaMenuParam;
import com.ysd.lis.dto.sta.StaModuleDto;
import com.ysd.lis.dto.sta.StaModuleParam;
import com.ysd.lis.entity.SysMenu;
import com.ysd.lis.entity.SysModule;
import com.ysd.lis.entity.sta.StaMenu;
import com.ysd.lis.entity.sta.StaModule;
import com.ysd.lis.entity.sta.StaModuleMenu;
import com.ysd.lis.mapper.sta.StaMenuMapper;
import com.ysd.lis.mapper.sta.StaModuleMapper;
import com.ysd.lis.mapper.sta.StaModuleMenuMapper;
import com.ysd.lis.mapper.sys.SysMenuMapper;
import com.ysd.lis.mapper.sys.SysModuleMapper;
import com.ysd.lis.service.sta.StaModuleMenuService;
import com.ysd.util.ToolsUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * cold_chain.sys_Model 服务实现类
 * </p>
 *
 * @author prs
 * @since 2024-12-27
 */
@Service
public class StaModuleMenuServiceImpl extends ServiceImpl<StaModuleMenuMapper, StaModuleMenu> implements StaModuleMenuService {
    @Autowired
    StaModuleMenuMapper staModuleMenuMapper;
    @Override
    public Result findStaModuleMenuList(StaModuleParam param) {
        MPJLambdaWrapper<StaModuleMenu> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(StaModuleMenu.class)
                .selectAs("ld", StaMenu::getMenuCode,StaModuleMenu::getMenuCode)
                .selectAs("ld", StaMenu::getMenuTitle,StaModuleMenu::getMenuTitle)
                .selectAs("ld", StaMenu::getIcon,StaModuleMenu::getIcon)
                .selectAs("ld", StaMenu::getUrl,StaModuleMenu::getUrl)
                .leftJoin(StaMenu.class,"ld",StaMenu::getId,StaModuleMenu::getStaMenuId)
                .eq(StaModuleMenu::getStaModId,param.getStaModId());
        if (StringUtils.isNotBlank(param.getSeachValue())) {
            queryWrapper.and(wrapper -> wrapper.like(StaModuleMenu::getStaMenuCode, param.getSeachValue())
                    .or().like(StaMenu::getMenuCode, param.getSeachValue())
                    .or().like(StaMenu::getMenuTitle,param.getSeachValue()));
        }
        queryWrapper.eq(StaModuleMenu::getDelFlag,0)
                .orderByAsc(StaModuleMenu::getSeq);
        List<StaModuleMenu> itemList = staModuleMenuMapper.selectList(queryWrapper);

        return Result.succ(1, "查询成功", itemList);
    }

    @Override
    public Result batchDeleteStaModuleMenuList(StaModuleDto dto) {
        List<StaModuleMenu> staModuleMenuList = dto.getStaModuleMenuList();
        List<String> ids = staModuleMenuList.stream().map(StaModuleMenu::getId).collect(Collectors.toList());
        boolean b = this.removeByIds(ids);
        if (b) {
            return Result.succ(1, "成功", null);
        } else {
            return Result.fail(400, "失败", "");
        }
    }

    @Override
    public Result batchAddStaModuleMenuList(StaModuleDto dto) {
        List<StaModuleMenu> staModuleMenuList = dto.getStaModuleMenuList();
        boolean b = this.saveBatch(staModuleMenuList);
        if(b){
            return Result.succ(1, "添加成功", null);
        }else {
            return Result.fail(400,"添加失败","");
        }
    }

    @Autowired
    StaModuleMapper staModuleMapper;
    @Autowired
    SysModuleMapper sysModuleMapper;
    @Autowired
    StaMenuMapper staMenuMapper;
    @Autowired
    SysMenuMapper sysMenuMapper;
    @Override
    public Result sysModuleMenu(StaMenuParam param) {
        //查出所有的标准模块
        MPJLambdaWrapper<StaModule> lambdaQueryWrapper1 = new MPJLambdaWrapper<>();
        lambdaQueryWrapper1.eq(StaModule::getDelFlag, 0);
        List<StaModule> staModuleList = staModuleMapper.selectList(lambdaQueryWrapper1);

        MPJLambdaWrapper<SysModule> lambdaQueryWrapper = new MPJLambdaWrapper<>();
        lambdaQueryWrapper.eq(SysModule ::getDelFlag, 0);
        List<SysModule> sysModuleList = sysModuleMapper.selectList(lambdaQueryWrapper);


        MPJLambdaWrapper<StaMenu> lambdaQueryWrapper2 = new MPJLambdaWrapper<>();
        lambdaQueryWrapper2.eq(StaMenu::getDelFlag, 0);
        List<StaMenu> staMenuList = staMenuMapper.selectList(lambdaQueryWrapper2);

        LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysMenu::getDelFlag,0);
        queryWrapper.isNotNull(SysMenu::getParentId);
        queryWrapper.ne(SysMenu::getParentId,"");
        List<SysMenu> menuList = sysMenuMapper.selectList(queryWrapper);

        for(StaModule staModule:staModuleList){
             //找出sysModuleList中对应的sysmodule
            List<SysModule> collect = sysModuleList.stream().filter(a -> a.getCode().equals(staModule.getModCode())).collect(Collectors.toList());
            if(ToolsUtils.isNotEmpty(collect)){
                SysModule sysModule = collect.get(0);
                //取出对应的menuList
                List<SysMenu> collect1 = menuList.stream().filter(a -> a.getModuleId().equals(sysModule.getId())).collect(Collectors.toList());
                if(ToolsUtils.isNotEmpty(collect1)){
                    for(SysMenu menu:collect1){
                        //找出对应的staMenu
                        List<StaMenu> collect2 = staMenuList.stream().filter(a -> a.getMenuCode().equals(menu.getCode())).collect(Collectors.toList());
                        if(ToolsUtils.isNotEmpty(collect2)){
                            StaMenu staMenu = collect2.get(0);
                            //找出对应的将数据插入到staModuleMenu中
                            StaModuleMenu staModuleMenu = new StaModuleMenu();
                            staModuleMenu.setStaModId(staModule.getId());
                            staModuleMenu.setStaModCode(staModule.getStaModCode());
                            staModuleMenu.setStaMenuId(staMenu.getId());
                            staModuleMenu.setStaMenuCode(staMenu.getStaMenuCode());
                            staModuleMenu.setSeq(staMenu.getSeq());
                            this.save(staModuleMenu);
                        }

                    }
                }
            }
        }



        return null;
    }
}
